package com.zzh.tools.utils;

import android.content.Context;
import android.content.SharedPreferences;

import java.util.HashMap;
import java.util.Map;

/**
 * @author zhangzhihao
 * @email zhangzhihao@gongjiangren.net
 * @date 2020-12-25
 * @desc
 */
public class ToolSharedPreferences {

    private static final String DEFAULT_NAME = "default";

    private static Map<String, SharedPreferences> sharedPreferencesMaps = new HashMap<>();

    private static SharedPreferences sharedPreferences;

    /**
     * 写入Boolean变量至sharedPreferences中
     *
     * @param context 上下文环境
     * @param key     存储节点名称
     * @param value   存储节点的值
     */
    public static void putBoolean(Context context, String key, Boolean value) {
        putBoolean(context, DEFAULT_NAME, key, value);
    }

    public static void putBoolean(Context context, String name, String key, Boolean value) {
        getSharedPreferences(context, name).edit().putBoolean(key, value).commit();
    }

    /**
     * 读取boolean标识从sharedPreferences中
     *
     * @param context 上下文环境
     * @param key     存储节点名称
     * @param value   没有此节点的默认值
     * @return 默认值或者此节点读取到的结果
     */
    public static boolean getBoolean(Context context, String key, Boolean value) {
        return getSharedPreferences(context, DEFAULT_NAME).getBoolean(key, value);
    }

    public static boolean getBoolean(Context context, String name, String key, Boolean value) {
        return getSharedPreferences(context, name).getBoolean(key, value);
    }

    /**
     * 写入String变量至sharedPreferences中
     *
     * @param context 上下文环境
     * @param key     存储节点名称
     * @param value   存储节点的值String
     */
    public static void putString(Context context, String key, String value) {
        getSharedPreferences(context, DEFAULT_NAME).edit().putString(key, value).commit();
    }

    public static void putString(Context context, String name, String key, String value) {
        getSharedPreferences(context, name).edit().putString(key, value).commit();
    }


    /**
     * 读取String标识从sharedPreferences中
     *
     * @param context  上下文环境
     * @param key      存储节点名称
     * @param defValue 没有此节点的默认值
     * @return 返回默认值或者此节点读取到的结果
     */
    public static String getString(Context context, String key, String defValue) {
        return getSharedPreferences(context, DEFAULT_NAME).getString(key, defValue);
    }

    public static String getString(Context context, String name, String key, String defValue) {
        return getSharedPreferences(context, name).getString(key, defValue);
    }

    /**
     * 写入int变量至sharedPreferences中
     *
     * @param context 上下文环境
     * @param key     存储节点名称
     * @param value   存储节点的值String
     */
    public static void putInt(Context context, String key, int value) {
        getSharedPreferences(context, DEFAULT_NAME).edit().putInt(key, value).commit();
    }

    public static void putInt(Context context, String name, String key, int value) {
        getSharedPreferences(context, name).edit().putInt(key, value).commit();
    }


    /**
     * 读取int标识从sharedPreferences中
     *
     * @param context  上下文环境
     * @param key      存储节点名称
     * @param defValue 没有此节点的默认值
     * @return 返回默认值或者此节点读取到的结果
     */
    public static int getInt(Context context, String key, int defValue) {
        return getSharedPreferences(context, DEFAULT_NAME).getInt(key, defValue);
    }

    public static int getInt(Context context, String name, String key, int defValue) {
        return getSharedPreferences(context, name).getInt(key, defValue);
    }

    /**
     * 从sharedPreferences中移除指定节点
     *
     * @param context 上下文环境
     * @param key     需要移除节点的名称
     */
    public static void remove(Context context, String key) {
        getSharedPreferences(context, DEFAULT_NAME).edit().remove(key).commit();
    }

    public static void remove(Context context, String name, String key) {
        getSharedPreferences(context, name).edit().remove(key).commit();
    }

    private static SharedPreferences createSharedPreferences(Context context, String name) {
        SharedPreferences sharedPreferences = context.getSharedPreferences(name, Context.MODE_PRIVATE);
        sharedPreferencesMaps.put(name, sharedPreferences);
        return sharedPreferences;
    }

    private static SharedPreferences getSharedPreferences(Context context, String name) {
        if (sharedPreferencesMaps.containsKey(name)) {
            return sharedPreferencesMaps.get(name);
        }
        return createSharedPreferences(context, name);
    }

}
